" 本文件只执行一次
if exists("g:hasVundle")
    finish
endif
let g:hasVundle = 1

""""""""""""""""""""""""""""""""""""""""""""""""""
"       Vundle 插件管理器的配置     需要放在前面
""""""""""""""""""""""""""""""""""""""""""""""""""
"""""
" 常用命令
" :PluginList       列出所有已配置的插件
" :PluginInstall    安装插件。追加 '!' 用以更新，等同 :PluginUpdate
" :PluginUpdate     更新插件。等同 :PluginInstall!
" :PluginSearch foo 搜索 foo 。追加 '!' 清除本地缓存
" :PluginClean      清除未使用插件，需要确认。追加 '!' 强制移除未使用插件
"
" :h vundle         获取更多细节和wiki，以及FAQ
"""""

" 设置自动下载 Vundle.vim 插件
if !filereadable(expand("~/.vim/bundle/Vundle.vim/README.md"))
    echo "Installing Vundle ..."
    if !executable("git")
        echo "Missing executable program 'git'. Install fails."
        finish
    else
        echo ""
        silent !git clone https://gitee.com/vim_runtime_plugins/Vundle.vim.git ~/.vim/bundle/Vundle.vim
        let g:hasVundle = 0
    endif
endif

" 去除 vi 一致性
set nocompatible
" 禁用文件类型检测
filetype off

" 设置包括 vundle 和初始化相关的 runtime path
set rtp+=~/.vim/bundle/Vundle.vim

" 如果刚刚下载完成 Vundle.vim 插件，那么进行插件的安装
if g:hasVundle == 0
    echo "Installing Plugins, please ignore key map error messages."
    echo ""
    autocmd vimenter * :PluginInstall
    autocmd vimenter * :q
    let g:hasVundle = 1
endif

"""""""""""""""""""
" Vundle 管理的插件 开始
"""""""""""""""""""
call vundle#begin()
" 让 vundle 管理插件版本
"Plugin 'VundleVim/Vundle.vim'
Plugin 'https://gitee.com/vim_runtime_plugins/Vundle.vim.git'

""""
" 这里写要被 vundle 管理的插件
" Plugin 'vim_plugin_repos_name'            " vim script plugin
" Plugin 'user_name/vim_plugin_repos_name'  " github plugin
" Plugin 'vim_plugin_repos_full_url_path'   " custom plugin
""""


" VIM 中文帮助信息插件
" 本插件使用命令 :set helplang=ch 来让VIM打开中文帮助信息。
" 在VIM中使用命令 :set helplang=en 来临时让VIM打开英文帮助信息。
" tag v2.3.0 对应 VIM v8.2
" tag v2.2.0 对应 VIM v8.1
" tag v2.1.0 对应 VIM v8.0
" tag v2.0.0 对应 VIM v8.0
" tag v1.9.0 对应 VIM v7.4
"Plugin 'yianwillis/vimcdoc'
Plugin 'https://gitee.com/dglxlcl/vimcdoc.git'


" 轻量级的状态栏插件
"Plugin 'itchyny/lightline.vim'
Plugin 'https://gitee.com/vim_runtime_plugins/lightline.vim.git'
" 一个快速、折叠的 Markdown 大纲。
Plugin 'https://gitee.com/vim_runtime_plugins/vim-minimd.git'
" 保持以前的拉出、更改和删除的历史记录
Plugin 'https://gitee.com/vim_runtime_plugins/YankRing.vim.git'

" 源码浏览器（支持C/C++、java、perl、python、tcl、sql、php等）。依赖可执行程序
" ctags
Plugin 'https://gitee.com/vim_runtime_plugins/taglist.vim.git'
" 保存时自动更新标签(tags)文件中的条目。依赖可执行程序 ctags
Plugin 'https://gitee.com/vim_runtime_plugins/AutoTag.git'
" 额外突出显示 typedef、枚举等（基于 ctags）。依赖可执行程序 ctags
Plugin 'https://gitee.com/vim_runtime_plugins/TagHighlight.git'

" 创建cscope数据库并自动连接到现有的适当数据库。 依赖可执行程序 cscope
"Plugin 'cscope.vim'
" 将自动搜索和加载 cscope.out 数据库的脚本。 依赖可执行程序 cscope
"Plugin 'autoload_cscope.vim'
" C语言调用树   依赖可执行程序 cscope
"Plugin 'https://gitee.com/vim_runtime_plugins/CCTree.git'

" 快速替换文件（.c <--> .h等）
Plugin 'https://gitee.com/vim_runtime_plugins/a.vim.git'
" (G)Vim 中的 GDB 命令行界面和终端模拟器。
"Plugin 'Conque-GDB'

" Vim 脚本库
Plugin 'https://gitee.com/vim_runtime_plugins/L9.git'
" 带有模糊匹配的缓冲区/文件/命令/标签/等资源管理器 依赖 vim脚本库 L9
Plugin 'https://gitee.com/vim_runtime_plugins/FuzzyFinder.git'

" 简化C、C++、Python中的Doxygen文档。
Plugin 'https://gitee.com/vim_runtime_plugins/DoxygenToolkit.vim'
" 管理最近使用 (MRU) 文件的插件
Plugin 'https://gitee.com/vim_runtime_plugins/mru.vim.git'
" 搜索中单词的补全 ('/')中通过 <C-P/N> 来补全
Plugin 'https://gitee.com/vim_runtime_plugins/cmdline-completion.git'

" 自动打开弹出式菜单，以便完成任务
Plugin 'https://gitee.com/vim_runtime_plugins/AutoComplPop.git'
" 使用ctags数据库的C/C++全能补全功能 与插件 AutoComplPop 一起使用
Plugin 'https://gitee.com/vim_runtime_plugins/OmniCppComplete.git'
" 代码补全插件
"Plugin 'ycm-core/YouCompleteMe'
Plugin 'https://gitee.com/you-complete-me/YouCompleteMe.git'
" YouCompleteMe 插件的配置文件生成器
Plugin 'https://gitee.com/vim_runtime_plugins/YCM-Generator.git'
" 一款功能强大的代码片段补齐插件,可自定义代码模板,并具备单词补齐的功能。
"Plugin 'https://gitee.com/vim_runtime_plugins/vim-snippets.git'
" xptemplate，比 snipmate 更强的代码片段补全
"Plugin 'https://gitee.com/vim_runtime_plugins/xptemplate.git'
" 语法检查插件
"Plugin 'https://gitee.com/vim_runtime_plugins/syntastic.git'

" 直观地显示标记(marks)的位置。
Plugin 'https://gitee.com/vim_runtime_plugins/vim-signature.git'
" 用于导航文件系统的树资源管理器插件
Plugin 'https://gitee.com/vim_runtime_plugins/The-NERD-tree.git'
" Vim 会话管理器
Plugin 'https://gitee.com/vim_runtime_plugins/sessionman.vim.git'

" 一个方便的缓冲区切换器
Plugin 'https://gitee.com/vim_runtime_plugins/bufferhint.git'



call vundle#end()
filetype plugin indent on   " 打开文件类型检测功能
"""""""""""""""""""
" Vundle 管理的插件 结束
"""""""""""""""""""




" ==========================================================
"                       VIM 基本配置
" ==========================================================


" 为特定文件类型载入相关缩进文件
filetype indent on

" y可以直接复制内容到系统剪贴板
set clipboard=unnamed

" set over 80 char prompt
"set colorcolumn=80
highlight ColorColumn ctermbg=235 guibg=#2c2d27
let &colorcolumn="80,".join(range(120,999),",")

" set line number
set nu

" 高亮光标所在行  背景为黑色，文字为黄色
set cursorline
highlight CursorLine    cterm=NONE ctermbg=black    ctermfg=yellow guibg=NONE guifg=NONE
" 高亮光标所在列  背景为黑色，文字为绿色
"set cursorcolumn
"highlight CursorColumn  cterm=NONE ctermbg=black    ctermfg=green guibg=NONE guifg=NONE

" 设置鼠标选中文本的时候vim进入什么模式
" n     普通模式(Normal)
" v     可视模式(Visual)
" i     插入模式(Insert)
" c     命令模式(command)
" h     在帮助文件里，以上所有的模式
" a     以上所有的模式
" A     在可视模式下自动选择
" r     ?
if has('mouse')
    set mouse-=a    " 去除 a
endif

" 配置 backspace 的工作方式
set backspace=indent,eol,start

" 光标周围显示几行上下文。
set scrolloff=0


" 定义文件格式    dos换行符为\r\n，unix换行符为\n，mac换行符为\r
set fileformats=unix,dos
" 设置vim内部编码
set encoding=utf-8
set langmenu=zh_CN.UTF-8
set termencoding=utf-8
" 设置vim打开文件时支持的文件编码方式列表
set fileencodings=utf-8,gbk,chinese


" 允许在有未保存的修改时切换缓冲区，此时的修改由 vim 负责保存
set hidden

" 让汉字以2个字符宽度显示
set ambiwidth = "double"

" 语法高亮
syntax on

" 在处理未保存或只读文件的时候，弹出确认
" 在关闭打开了多个未访问文件的时候，弹出确认
set confirm

" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-

" 修改弹出菜单的颜色
" Pmenu 弹出菜单中所有项。      PmenuSel 弹出菜单中选中项。
" guibg/ctermbg 背景色          guifg/ctermfg 前景色
highlight Pmenu     guibg=darkgrey      guifg=black
highlight PmenuSel  guibg=lightgrey     guifg=black
" 弹出菜单中所有项的背景色为亮银色(Silver)，前景色为黑色(black)
" 弹出菜单中选中项的背景色为紫色(Purple), 前景色为黑色(black)
highlight Pmenu     ctermbg=7           ctermfg=black
highlight PmenuSel  ctermbg=5           ctermfg=black



" ============================
" 创建目录的函数
" ============================
function! CreateDirIfNotExists(dirpath)
    if !isdirectory(a:dirpath)
        try
            call mkdir(a:dirpath, 'p', 0755)
        catch /.*/
            echoe 'Failed to create directory: ' . a:dirpath
        endtry
    endif
endfunction



" ============================
" 文件设置
" ============================

" 交换文件，备份文件，撤销文件保存到 /tmp 目录下
let s:toTmp = 1

" 不要生成swap文件，当buffer被丢弃的时候隐藏它
"setlocal noswapfile
"set bufhidden=hide
" 启用交换文件，并将交换文件保存到指定目录下
if s:toTmp
    let s:swap_dir = "/tmp/" . $USER . "/vim/swap"
else
    let s:swap_dir = $HOME . "/.vim/temp/swap"
endif
call CreateDirIfNotExists(s:swap_dir)
"set directory="~/.vim/temp/swap"
let &directory=s:swap_dir
set updatecount=100

" 如果支持撤销功能，那么启用撤消功能，并将保存撤消信息的文件保存在指定目录下
if has('persistent_undo')
    if s:toTmp
        let s:undo_dir = "/tmp/" . $USER . "/vim/undodir"
    else
        let s:undo_dir= $HOME . "/.vim/temp/undodir"
    endif
    call CreateDirIfNotExists(s:undo_dir)
    "set undodir=~/.vim/temp/undodir
    let &undodir=s:undo_dir
    set undofile
    set nobackup
endif

" 启用备份功能，并指定备份文件生成目录
if s:toTmp
    let s:backup_dir = "/tmp/" . $USER . "/vim/backupdir"
else
    let s:backup_dir = $HOME . "/.vim/temp/backupdir"
endif
call CreateDirIfNotExists(s:backup_dir)
"set backupdir=~/.vim/temp/backupdir
let &backupdir=s:backup_dir
set backup
set backupskip=""

if has('viminfo')
    " viminfo 配置说明
    " % 保存所有(有文件名的)缓冲区。当启动vim的时候没有指定文件名，那么将恢复
    "   之前关闭vim时打开的缓冲区
    " '100 保存文件中最近100个标记(mark)
    " /50 保存最多50个历史搜索/替换
    " :50 保存最多50个历史命令
    " <1000 每个寄存器中最多保存1000行数
    " @1000 保存输入行最多1000个历史
    " h 加载viminfo的时候忽略对viminfo文件中保存的搜索结果的高亮
    " s10 不保存超过10KiB的寄存器
    set viminfo=%,'100,/50,:50,@1000,<1000,h,s10

    " 设置保存vim退出前的vim相关信息的文件的路径
    if s:toTmp
        let s:viminfo_dir="/tmp/" . $USER . "/vim/info/"
    else
        let s:viminfo_dir=$HOME . "/.vim/temp/info/"
    endif
    call CreateDirIfNotExists(s:viminfo_dir)
    if s:toTmp
        set viminfo+=n/tmp/$USER/vim/info/viminfo
    else
        set viminfo+=n$HOME/.vim/temp/info/viminfo
    endif
endif

" 在被分割的窗口间显示空白，便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\


" ============================
" 搜索和匹配
" ============================

" 高亮显示匹配的括号
set showmatch

" 匹配括号高亮的时间（单位是十分之一秒）
set matchtime=5

" 搜索时忽略大小写，但有搜索的字符中有多个大写字母的时候还是对大小写敏感
set ignorecase smartcase
" 禁止在搜索到文件两端的时候重新搜索
"set nowrapscan
" 输入搜索内容的时候就显示搜索结果
set incsearch
" 搜索时高亮显示结果
set hlsearch
" 设置搜索结果高亮颜色
"highlight Search term=NONE cterm=bold ctermfg=9 ctermbg=7 guifg=#242424 guibg=#8ac6f2
highlight Search term=NONE cterm=bold ctermfg=9 ctermbg=255 guifg=#242424 guibg=#8ac6f2


" ============================
" 文本格式和排版
" ============================

" set tab to 4 space
set tabstop=4           " tab 的宽度为4个空格
set softtabstop=4       " 一般和 tabstop 一致
set expandtab           " 使用空格代替 tab
set shiftwidth=4        " 缩进为4个空格
set autoindent          " 继承前一行的缩进方式，特别适用于多行注释

" 自动格式化
" 常用的数值有：
" t：根据 textwidth 自动折行；
" c：在（程序源代码中的）注释中自动折行，插入合适的注释起始字符；
" r：插入模式下在注释中键入回车时，插入合适的注释起始字符；
" q：允许使用“gq”命令对注释进行格式化；
" n：识别编号列表，编号行的下一行的缩进由数字后的空白决定（与“2”冲突，需要“autoindent”）；
" 2：使用一段的第二行的缩进来格式化文本；
" l：在当前行长度超过 textwidth 时，不自动重新格式化；
" m：在多字节字符处可以折行，对中文特别有效（否则只在空白字符处折行）；
" M：在拼接两行时（重新格式化，或者是手工使用“J”命令），
"    如果前一行的结尾或后一行的开头是多字节字符，则不插入空格，非常适合中文
set formatoptions=tcrqnmM

" 为C程序提供自动缩进
set smartindent

" 使用C样式的缩进
set cindent


" ============================
" 自动命令 autocommands
" ============================

if has("autocmd")

autocmd BufNewFile *.py 0r ~/.vim/template_file/vim_python_header
autocmd BufNewFile *.c,*.cpp 0r ~/.vim/template_file/vim_c_header
autocmd BufNewFile *.h 0r ~/.vim/template_file/vim_ch_header
autocmd BufNewFile *.sh 0r ~/.vim/template_file/vim_shell_header
autocmd BufNewFile *.py,*.[ch],*.cpp,*.sh ks|call FileName_CreatedTime()|'s
autocmd BufNewFile *.c,*.cpp ks|call AddHeadFile()|'s
autocmd BufNewFile *.h ks|call AddchMacro()|'s

fun FileName_CreatedTime()
    exe "g/@file/s//@file     " .expand("%:t")
    exe "g/Year/s//".strftime("%Y")
    exe "g/datetime/s//".strftime("%Y-%m-%d %T")
    exe "g/TEMPLATE/s//".toupper(expand("%:t:r"))
    exe "g/TEMPLATE/s//".toupper(expand("%:t:r"))
    exe "g/Template/s//".expand("%:t:r")
endfun

fun AddHeadFile()
    exe "g/@HEAD_FILE/s//".expand("%:t:r").".h"
endfun

fun AddchMacro()
    exe "g/MmyFileName/s//" .toupper(expand("%:t:r"))
endfun

endif " has("autocmd") end






" ==========================================================
"                       插件配置
" ==========================================================

" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 状态行 lightline
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 配置颜色模式，并且shell中要配置：export TERM=xterm-256color
if !has('gui_running')
  set t_Co=256  " vim的颜色数量
endif

" 显示状态行    1:启动显示 2:总是显示
set laststatus=2
" 状态行要显示的内容
let g:lightline = {
    \ 'colorscheme': 'wombat',
    \ 'active': {
    \   'left': [
    \     [ 'mode', 'paste' ],
    \     [ 'readonly', 'nubuf', 'filename', 'modified', 'datetime' ],
    \   ]
    \ },
    \ 'component': {
    \   'nubuf': '%n',
    \   'datetime': '%{strftime("%Y-%m-%d\ %H:%M")}',
    \ },
    \ }



" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 补全 YouCompleteMe
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h youcompleteme
"
" 操作命令
" :YcmRestartServer     重启 YCM
" :YcmDiags     查看 locationlist 窗口中当前文件检测到的警告和错误信息
"               依赖 'g:ycm_open_loclist_on_ycm_diags = 1'
" :lopen        打开 locationlist 窗口，查看所有诊断信息。
"               依赖 'g:ycm_always_populate_location_list = 1'
" :lclose       关闭 locationlist 窗口
"               依赖 'g:ycm_always_populate_location_list = 1'
" :YcmShowDetailedDiagnostic    查看光标所在行上的诊断信息
" :YcmDebugInfo 这将打印出当前文件的各种调试信息。
"               如果您使用语义完成引擎，则查看将用于文件的编译命令很有用。
" :YcmToggleLogs
"
" 快捷键信息
" <Leader>d     查看光标所在行上的诊断信息
" <TAB>         弹出菜单下一项。同 下方向键
" <S-TAB>       弹出菜单上一项。同 上方向键
" <C-e>         停止补全，并退回到原来录入的文字
" <C-y>         停止补全，并接受当前选项
" <C-space>     手动触发语义补全

" 配置 YouCompleteMe 的解释器路径和全局配置文件路径
let g:ycm_server_python_interpreter = '/usr/bin/python3'
"let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py'
let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'
"let g:ycm_extra_conf_globlist = ['~/.vim/.ycm_extra_conf.py']
let g:ycm_confirm_extra_conf = 0    " 关闭vim加载 .ycm_extra_conf 的提示
" 禁用 clangd
let g:ycm_use_clangd = 0

" 开启中注释中补全功能
let g:ycm_complete_in_comments = 1
" 开启标签补全功能
let g:ycm_collect_identifiers_from_tags_files = 1
" 开启语法关键字补全功能
let g:ycm_seed_identifiers_with_syntax = 1
" 禁止缓存匹配项，每次都实时匹配。可能会有性能问题
let g:ycm_cache_omnifunc = 0
" 设置停止解析的门限，为了性能考虑，文件大于1MiB，就停止解析
let g:ycm_disable_for_files_larger_than_kb = 1024

let g:ycm_enable_diagnostic_signs = 1
" 在检测到语法错误时，显示的符号
let g:ycm_error_symbol = 'e>'
" 在检测到语法警告时，显示的符号
let g:ycm_warning_symbol = 'w>'
" 禁止在检测到语法警告/错误时高亮
let g:ycm_enable_diagnostic_highlighting = 0

" 配置 c/lua 语言的语义补全触发条件
let g:ycm_semantic_triggers = {
    \ 'c' : ['->', '.', 're!\w{2}'],
    \ 'lua' : ['.', ':', 're!\w{2}'],
    \ }

" 配置分析白名单
let g:ycm_filetype_whitelist = {
    \ 'c': 1,
    \ 'cpp': 1,
    \ 'sh': 1,
    \ 'py': 1,
    \ 'lua': 1,
    \ }

" 开启自动填充诊断信息到 locationlist 窗口
let g:ycm_always_populate_location_list = 1
" 开启 :YcmDiags 命令强制填充诊断数据到 locationlist 窗口
let g:ycm_open_loclist_on_ycm_diags = 1

" 显示光标所在行的诊断文本，如果该行有错误的话
let g:ycm_echo_current_diagnostic = 1

" 弹出菜单中下一项的快捷键。
let g:ycm_key_list_select_completion = ['<TAB>', '<Down>']
" 弹出菜单中上一项的快捷键。
let g:ycm_key_list_previous_completion = ['<S-TAB>', '<Up>']
" 停止补全，并接受当前选项
let g:ycm_key_list_stop_completion = ['<C-y>']
" 手动触发语义补全的快捷键。
let g:ycm_key_invoke_completion = '<c-space>'










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 源码浏览器 taglist.vim
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" TagBar插件(Taglist的升级版)，有时间看看这个插件

" 查看帮助信息
" :h taglist.txt        查看taglist插件帮助信息
"
" 操作命令
" tl            打开/关闭taglist窗口
"
" taglist窗口的操作
" :TlistOpen            打开符号窗口
" :TlistClose           关闭符号窗口
" :TlistToggle          在打开和关闭之间进行切换
"
" taglist窗口中tag的操作
" <CR>          跳转到光标下tag所定义的位置，用鼠标双击此tag功能也一样
" o             在一个新打开的窗口中显示光标下的tag的内容
" p             预览光标下的tag的内容。与 <CR> 不一样的是光标还在taglist窗口
" <space>       显示光标下tag的原型定义
" u             更新taglist窗口中的tag
" s             更改taglist窗口中的tag的排序方式，在按名字和出现顺序间切换
" d             从taglist窗口中移除光标下tag所在文件的所有tag
" x             taglist窗口在缩小和放大之间切换，方便查看较长tag
" +             打开一个折叠，同 zo
" -             关闭一个折叠，同 zc
" *             打开所有的折叠，同 zR
" =             关闭所有的折叠，同 zM
" [[            跳到前一个文件，的tag开头
" ]]            跳到后一个文件，的tag开头
" q             关闭taglist窗口
" <F1>          打开/关闭taglist窗口的帮助信息

" 不同时显示多个文件的tag，只显示当前文件的
"let Tlist_Show_One_File = 1
" 显示多个文件的tag时，使taglist窗口只显示当前文件的tag，其它的tag都被折叠起来
let Tlist_File_Fold_Auto_Close = 1

" 如果taglist窗口是最后一个窗口，则退出vim
let Tlist_Exit_OnlyWindow = 1
" 启动vim后自动打开 taglist 窗口
"let Tlist_Auto_Open = 1

" 在右侧窗口中显示taglist窗口
let Tlist_Use_Right_Window = 1
" 设置taglist窗口横向显示
" let Tlist_Use_Horiz_Window = 1
" 使用 :TlistToggle 打开taglist窗口的时候，输入焦点位于taglist窗口中
let Tlist_GainFocus_On_ToggleOpen = 1

" 设置taglist窗口的高度
" let Tlist_WinHeight
" 设置taglist窗口的宽度
" let Tlist_WinWidth

" 设置打开/关闭taglist窗口的快捷键 tl
nnoremap <silent> tl :TlistToggle<CR>










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 额外突出显示 typedef、枚举 TagHighlight
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h TagHighlight.txt
" :h TagHighlight
" :highlight                查看vim当前的配色方案
"
" 操作命令
" <C-h>l        更新高亮
"
" 更新高亮的tag
" :UpdateTypesFile          更新当前打开的文件的信息到
"                           tags 文件与着色文件 types_c.taghl
" :UpdateTypesFileOnly      仅根据找到的tags文件来更新当前文件的信息到
"                           着色文件 types_c.taghl

" 设置更新高亮的快捷键 <C-h>l
" 使用 :UpdateTypesFile 来生成的 tags 文件中没有只有函数声明
" 的 .h 文件的tag信息，最好使用之前已经生成的tags文件
nnoremap <silent> <C-h>l :UpdateTypesFile<CR>
"nnoremap <silent> <C-h>l :UpdateTypesFileOnly<CR>

" 下面对于TagHighlight 插件的配置一点用都没有

if ! exists('g:TagHighlightSettings')
    let g:TagHighlightSettings = {}
endif

if ! exists('b:TagHighlightSettings')
    let b:TagHighlightSettings = {}
endif

" 不生成 tags 文件。这样 :UpdateTypesFile 就等同于 :UpdateTypesFileOnly
let g:TagHighlightSettings['DoNotGenerateTags'] = 1
let b:TagHighlightSettings['DoNotGenerateTags'] = 1
let g:DoNotGenerateTags = 1










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 快速替换文件（.c <--> .h ） a.vim
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
"
" 操作命令
" <F12>     切換 .c/.h 文件
"
" 命令说明
" :A        在当前窗口切换文件 .c <-> .h
" :AS       新建一个水平窗口并显示切换后的文件
" :AV       新建一个垂直窗口并显示切换后的文件
" :AT       新建一个标签页并显示切换后的文件

" 设置切换文件的快捷键 <F12>
nnoremap <silent> <F12> :A<CR>










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 模糊匹配的缓冲区/文件/命令/标签/等资源管理器     FuzzyFinder
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h FuzzyFinder
" :h fuzzyfinder
" :h fuzzyfinder@en
"
" 操作命令
" scf       搜索文件名
" sct       搜索 tag

" 定义搜索文件的快捷键 Normal模式下输入 scf
nnoremap <silent> scf :FufFile<CR>
" 定义搜索 tag 的快捷键 Normal模式下输入 sct
nnoremap <silent> sct :FufTag<CR>

" 设置保存数据文件的目录
if s:toTmp
    let s:fuf_data_dir="/tmp/" . $USER . "/vim/FuzzyFinder"
else
    let s:fuf_data_dir=$HOME . "/.vim/temp/FuzzyFinder"
endif
call CreateDirIfNotExists(s:fuf_data_dir)
let g:fuf_dataDir=s:fuf_data_dir










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 管理最近使用 (MRU) 文件  mru.vim
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
"
" 命令说明
" :Mru      打开一个窗口显示最近使用文件列表。
"           在MRU窗口中按 :q 关闭MRU窗口。
"           在MRU窗口中按回车(<CR>)可以打开光标所在的文件。

" 设置保存最近打开的文件名及其路径
if s:toTmp
    let s:mru_dir="/tmp/" . $USER . "/vim/MRU"
else
    let s:mru_dir=$HOME . "/.vim/temp/MRU"
endif
call CreateDirIfNotExists(s:mru_dir)
let MRU_File=s:mru_dir . "/vim_mru_files"










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 自动打开弹出式菜单，以便完成任务     AutoComplPop
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h acp
" :h autocomplpop
"
" 命令说明
" :AcpEnable            启用自动弹出式菜单
" :AcpDisable           禁用自动弹出式菜单

" 开启vim启动时启用自动弹出式菜单功能。默认值：1
let g:acp_enableAtStartup = 1










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 使用ctags数据库的C/C++全能补全功能   OmniCppComplete
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h OmniCppComplete
"
" 操作命令
" <C-e>         停止补全
" <C-n>         向下选择补全内容。等同下方向键
" <C-p>         向上选择补全内容。等同上方向键
"
" <C-x><C-l>    整行补全
" <C-x><C-n>    根据当前文件里关键字补全
" <C-x><C-k>    根据字典补全
" <C-x><C-t>    根据同义词字典补全
" <C-x><C-i>    根据头文件内关键字补全
" <C-x><C-]>    根据标签补全
" <C-x><C-f>    补全文件名
" <C-x><C-d>    补全宏定义
" <C-x><C-v>    补全vim命令
" <C-x><C-u>    用户自定义补全方式
" <C-x><C-s>    拼写建议

" 显示函数原型
let OmniCpp_ShowPrototypeInAbbr  = 1

" 修改弹出菜单的颜色
" Pmenu 弹出菜单中所有项。      PmenuSel 弹出菜单中选中项。
" guibg 背景色                  guifg 前景色
highlight Pmenu     guibg=darkgrey      guifg=black
highlight PmenuSel  guibg=lightgrey     guifg=black










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 直观地显示标记(marks)的位置  vim-signature
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h signature.txt
"
" 操作命令
" mx        标记当前行为x 。 x 的范围为 a-zA-z
" dmx       删除标记x 。 x 的范围为 a-zA-z
" m<Space>  删除当前缓冲区中所有标记
" m/        列出当前缓冲区中所有标记
" ]`        跳转到下一个标记
" [`        跳转到上一个标记










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 用于导航文件系统的树资源管理器插件   The-NERD-tree
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h NERD_tree.txt
"
" 操作命令
" ft        显示/隐藏文件系统树
"
" 在 NERD-tree 窗口下的操作命令
" h j k l   移动光标位置
" o         在原窗口中打开选中的文件，目录，书签
" <CR>      同 o
" go        在本窗口中打开选中的文件，目录，书签
" i         在新的水平窗口中打开选中的文件，光标也到新窗口中
" gi        同 i ，但是光标位置不变
" s         在新的纵向窗口中打开选中的文件
" gs        同 s ，但是光标位置不变
" O         递归打开选中的目录
" o         打开选中的目录
" X         递归关闭选中的目录
" x         关闭父目录
"
" D         删除当前书签
"
" P         跳转到根节点
" p         跳转到父节点
"
" C         更改当前选中的节点为根节点
"
" A         缩放窗口
" ?         帮助
" q         关闭

" 显示/隐藏文件系统树的快捷键 ft
nnoremap <silent> ft :NERDTreeMirror<CR>
nnoremap <silent> ft :NERDTreeToggle<CR>

" 显示隐藏文件
let NERDTreeShowHidden = 1
" 窗口位置  左
let NERDTreeWinPos = "left"










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 Vim 会话管理器       sessionman.vim
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
"










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 一个方便的缓冲区切换器   bufferhint
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h bufferhint
"
" 操作命令
" -         调出缓冲区窗口。再按一下就关闭该窗口。
"           在窗口中最左边有1到2个字母与文件关联，
"           按下相应的字母就切换到对应的缓冲区。
" "         切回上一个缓冲区。但你需要频繁的再两个文件来回切换时挺好用。
"
" 
" 在缓冲区窗口中：
" q         关闭窗口
" k/j       上下移动光标。<UP>, <DOWN>, <C-f>, <C-u>, gg, G 等也可以移动光标
" /xx       搜索文件名 xx
" dd        关闭该文件。 d + 文件左边的字母，即可关闭该文件
" <Space>   切换文件排序

" 设置打开/关闭缓冲区窗口的快捷键 -
nnoremap <silent> - :call bufferhint#Popup()<CR>
" 设置切换上一个缓冲区的快捷键 "
nnoremap <silent> " :call bufferhint#LoadPrevious()<CR>










" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置 保持以前的拉出、更改和删除的历史记录     YankRing.vim
" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 查看帮助信息
" :h yankring.txt
" :h yankring-tutorial
"
" :YRShow       显示 YankRing 中的内容，并通过方向键和回车键选择要使用的内容
" :YRSearch     搜索 YankRing 中的内容

" 设置保存历史修改记录的文件的目录 目录必须是已经存在了的，否则会报错
if s:toTmp
    let s:yank_ring_dir="/tmp/" .$USER . "/vim/YankRing.vim"
else
    let s:yank_ring_dir=$HOME . "/.vim/temp/YankRing.vim"
endif
call CreateDirIfNotExists(s:yank_ring_dir)
let g:yankring_history_dir=s:yank_ring_dir
" 设置保存历史修改记录的文件名
" YankRing.vim 会自动添加后缀 _v2.txt 后组成完整的文件名
let g:yankring_history_file = 'yankring_history'








